/**
 * 冯斌 2007-8-2
 */
package com.wsj.util.tool;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.struts.upload.FormFile;

/**
 * @author fengbin 2007-8-2
 *库存方面文件上传和文件管理
 *直接接受文件对象myFiles,然后处理
 *
 *两个重要的方法uploadFile(HttpServletRequest request,String updateFileName),
 *scale(String srcImageFile, String result, int scale,boolean flag,String mark)
 *
 *上传文件需要先设置myfiles,然后调用uploadFile就行了
 *
 */

public class FileUplaodAndManageForStorage {
	
	 private static Log logger = LogFactory.getLog(FileUplaodAndManageForStorage.class);
	
	//上传的文件对象
	public  FormFile  myFiles;
	
	//最大的文件最大是10M
    private int maxFileSize=10485760;
    
//	可以通过的文件扩展名
	private String[] passFileExtenSionName={"jpg","gif","jpeg"};
	
	private static final String[] fileTrueType={"image/pjpeg","image/gif","image/bmp"};
	
	//上传excel文件的路径
	private String path="log"+File.separator+"excelStorageData"+File.separator;
    
	//最后获得的文件名
	private String endFileName="";
	
	//是否检测文件真实类型
	private boolean checkFileTrueType=false;
	
    /***
     * 上传excel文件,如果file参数有的话则是覆盖这个excel文件
     * 参数:updateFileName:新的excel文件名,如果传入这个参数,可以把上传的文件重新命名.
     * 上传文件扩展名大小写不分
     * @param updateFileName
     * @return
     */
    public String uploadFile(HttpServletRequest request,String updateFileName) { 
		 StringBuffer message=new StringBuffer();
		 
//		 for(int j=0;j<1;j++)
//		 {
			 logger.info("\n\n开始上传图片!");
			 endFileName="";
			
			 if(checkUploadFile(myFiles,checkFileTrueType))
			 {
				 try {
						 InputStream in = new BufferedInputStream( 
								 myFiles.getInputStream());
						
							 //获得当前请求路径
							String newFilePath=this.getFilePath(request);
						 
						   File fileDir=new File(newFilePath);
						 
							if(!fileDir.exists()){
								
								if(!fileDir.mkdirs()){
									logger.info("\n\n\n文件夹创建失败");
								}
							}
							
							String inputFilePath=myFiles.getFileName();
							
							 String d=File.separator;
							 String splitStr="\\\\";
							  if(d.equals("\\"))//windows
							  {
								  splitStr="\\\\";
							  }
							  else//liunx
							  {
								  splitStr="/";
							  }
							
							  //对输入的文件名的处理
							String[] fileEnd=inputFilePath.split(splitStr);
						   String fileEndName=fileEnd[fileEnd.length-1];
						   @SuppressWarnings("unused") String endName="";
						   String end="";
						   String newFileName="";
						   if(fileEndName!=null)
						   {
							   int it=fileEndName.lastIndexOf(".");
						 		  endName=fileEndName.substring(0,it);
						 		  end=fileEndName.substring(it+1,fileEndName.length());
						 		  //规范所有上传文件扩展名都为小写.
						 		  end=end.toLowerCase();
						   }
						   
						   
						   /**
						    * 如果设置有上传文件名字,则使用新的上传名字,扩展名使用上传文件的扩展名
						    */
						   if(updateFileName!=null&&!updateFileName.equals(""))
						   {
							   newFileName=updateFileName+"."+end;
						   }
						   else
						   {
							   newFileName=loadUploadFileName()+"."+end;
						   }
						   

							
							//写入到数据流
							 BufferedOutputStream out=new BufferedOutputStream(new FileOutputStream(newFilePath+newFileName));
							 //设置流数据包的大小
							 byte[] buffer=new byte[64 * 1024];
								int length;
								while((length=in.read(buffer,0,buffer.length))>0)
								{
									out.write(buffer,0,length);
								}
								out.flush();
								out.close();
								
								//记录最后上传的文件名
								endFileName=newFileName;
								logger.info("上传文件成功");
								message.append("上传: "+newFileName+" 文件成功  ");
				 }
					catch (IOException e) {
						logger.error("上传文件,创建文件异常!");
						logger.error("\n\n\n创建文件异常");
						e.printStackTrace();
					} 
			 }
			 else
			 {
				 message.append("上传文件失败!");
			 }
			 
				
			 logger.info("\n\n结束上传图片!");
			 
//		 }
		 
		 //添加上传的信息
		 logger.error(message.toString());
		 
		 return endFileName;	 
			
			
	 }
    
    
    
    
    
    /***
	  * 检查上传的图片是否为空,
	  * 然后检查文件的大小,
	  * 再就是检查文件的类型,如果符合,就上传
	  * 如果检查正常,返回true,否则返回false
	  * checkFileType 如果为true表示检测文件类型
	  */
	 public boolean checkUploadFile(FormFile file,boolean checkFileType)
	 {
		 boolean isOk=true;
		 
		 if(file!=null)
		 {
			 String name=file.getFileName();
			 //检查文件名,是否为图片类型
			 if(name!=null&&!name.equals(""))
			 {
				boolean checkName= checkFileName(name);
				boolean checkFileTypeOk=true;
				
				if(checkFileType)
				{
					//检查文件类型
					checkFileTypeOk=this.checkFileTrueType(file,fileTrueType);
				}
				 if(checkName&&checkFileTypeOk)
				 {
//					检查文件大小,最大10M
					 int fileSize=file.getFileSize();
					   if(fileSize>maxFileSize)
					   {
						   isOk=false;
						   logger.error("文件太大,超过10M");
					   }
					  
					  
				 }
				 else
				 {
					 isOk=false;
					 logger.error("文件类型不匹配!");
				 }
				
			 }
			 else//文件名为空
			 {
				 isOk=false;
				 logger.error("文件名为空");
			 }
		 }
		 else
		 {
			 isOk=false;
			 logger.error("文件不存在");
		 }
		 return isOk;
	 }
	 
	 
	 /***
	  * 获取当前服务器用于文件上传的路经
	  * @return
	  */
	 public String getFilePath(HttpServletRequest request)
	 {
		 String d=File.separator;
		 String fileRealPath="";
		 String retFilePath="";
		 
		  if(d.equals("\\"))//windows
		  {
			  fileRealPath=request.getSession().getServletContext().getRealPath("\\");
;
		  }
		  else
		  {
			  fileRealPath=request.getSession().getServletContext().getRealPath("/");
;
		  }
		 
		  retFilePath=fileRealPath+path;
			
			return retFilePath; 
	 }
    

	 
	 
	 /***
	  * 检查文件后缀名
	  * 如果扩展名存在,返回真
	  */
	 public boolean checkFileName(String inputFilePath)
	 {
		 //不存在的图片
		 boolean notExtendsionPic=false;
		 //获得文件末尾信息
		 Map endNameMap=this.getEndFileNameMessage(inputFilePath);
		 if(endNameMap!=null)
		 {
			 //获得扩展名
			 String extensionName=(String) endNameMap.get("extensionName");
			 if(extensionName!=null&&!extensionName.equals(""))
			 {
				 //获得可以通过的文件名
				 for(int j=0;j<passFileExtenSionName.length;j++)
				 {
						//大小写转化
					 extensionName=extensionName.toLowerCase();
					 if(passFileExtenSionName[j].equals(extensionName))
					 {
						 notExtendsionPic=true;
					 }
				 } 
			 }
			 else
			 {
				 notExtendsionPic=false;
			 }
			 
		 }
		 else
		 {
			 notExtendsionPic=false;
		 }
		 
		 return notExtendsionPic;
		 
	 }
	 
	 
	 /**
	  * 检查文件的媒体类型
	  * @param file
	  * @param fileType 允许上传的的文件类型
	  * @return
	  */
	 
	 public boolean checkFileTrueType(FormFile file,String[] fileType)
	 {
		 boolean ret=false;
		 String fileContext=file.getContentType();
		 for(int j=0;j<fileType.length;j++)
		 {
			 if(fileContext.equals(fileType[j]))
			 {
				 ret=true;
			 }
		 }
		 
		 return ret;
		 
	 }
	 
	 
	 /**
	  * 检查上传文件的后缀名
	  * 输入路径,返回末尾的文件名的hashMap对象
	  */
	 public Map getEndFileNameMessage(String inputFilePath)
	 {
			
		 Map<String,String> map=new HashMap<String,String>();
		 
		 String d=File.separator;
		 String splitStr="\\\\";
		  if(d.equals("\\"))//windows
		  {
			  splitStr="\\\\";
		  }
		  else//liunx
		  {
			  splitStr="/";
		  }
		
		String[] fileEnd=inputFilePath.split(splitStr);
	   String fileEndName=fileEnd[fileEnd.length-1];
//	   int it=fileEndName.indexOf(".");
	   int last=fileEndName.lastIndexOf(".");
	   //如果有点的话
	   if(last>0)
	   {

		   String endName="";
		   String extensionName="";
		   if(fileEndName!=null)
		   {
			      
		 		  endName=fileEndName.substring(0,last);
		 		 extensionName=fileEndName.substring(last+1,fileEndName.length());
		 		 //把扩展名变成小写
		 		extensionName=extensionName.toLowerCase();
		   }
		   
		   //末尾的文件全名
		   map.put("fileEndName",fileEndName);
		   map.put("systemPath",d);
		   map.put("endName",endName);
		   map.put("point",String.valueOf("."));
		   map.put("extensionName",extensionName); 
	   }
	  
	   return map;
	   

	 }

	 
	 
	 
	 /**
	  * 缩放图片
	  * 
	  * @param srcImageFile
	  *            源图像文件地址
	  * @param result
	  *            缩放后的图像地址
	  * @param scale
	  *            缩放比例
	  * @param flag
	  *            缩放选择:true 放大; false 缩小;
	  *            mark 标志比如:small,big等
	  */
	 public  void scale(String srcImageFile, String result, int scale,boolean flag,String mark) {
	  try {
	   BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
	   int width = src.getWidth(); // 得到源图宽
	   int height = src.getHeight(); // 得到源图长
	   if (flag) {
	    // 放大
	    width = width * scale;
	    height = height * scale;
	   } else {
	    // 缩小
	    width = width / scale;
	    height = height / scale;
	   }
	   Image image = src.getScaledInstance(width, height,Image.SCALE_DEFAULT);
	   BufferedImage tag = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
	   Graphics g = tag.getGraphics();
	   g.drawImage(image, 0, 0, null); // 绘制缩小后的图
	   g.dispose();
	   
	   
	   //获取文件名
	   String fileName="";
	   String endName="";
	   String end="";
	   String oldFilePath="";
	   if(srcImageFile!=null)
	   {
		 
		   String d=File.separator;
		   
			 String splitStr="\\\\";
			  if(d.equals("\\"))//windows
			  {
				  splitStr="\\\\";
			  }
			  else//liunx
			  {
				  splitStr="/";
			  }
	 	  String[] files=srcImageFile.split(splitStr);
	 	   fileName=files[files.length-1];
	 	  if(fileName!=null)
	 	  {
	 		  int it=fileName.lastIndexOf(".");
	 		  endName=fileName.substring(0,it);
	 		  end=fileName.substring(it+1,fileName.length());
	 	  }
	 	  
	 	  StringBuffer buffer=new StringBuffer();
	 	  for(int t=0;t<files.length-1;t++)
	 	  {
	 		  
	 		 if(d.equals("\\"))//windows
			  {
	 			buffer.append(files[t]).append("\\");
			  }
			  else//liunx
			  {
				  buffer.append(files[t]).append("/");
			  }
	 		  
	 	  }
	 	  oldFilePath=buffer.toString();
	 	  
	 	  
	   }
	   
	   String myFilePath=oldFilePath;
	   if(result==null||result.equals(""))
	   {
		   if(mark!=null)
		   {
			   if(!mark.equals(""))
			   {
				   result=myFilePath+mark+"_"+endName+"."+end;
			   }
		   }   
	   }
	  
	  
	   
	   ImageIO.write(tag, "JPEG", new File(result));// 输出到文件流
	  } catch (IOException e) {
	   e.printStackTrace();
	  }
	 }
	 
	 /**
	  * 根据标准长度和宽度缩放图片
	  * @param srcImageFile
	  * @param result
	  * @param width
	  * @param length
	  */
	 
	 public  void scale(String srcImageFile, String result, int width,int height,String mark) {
		  try {
		   BufferedImage src = ImageIO.read(new File(srcImageFile)); // 读入文件
		   Image image = src.getScaledInstance(width, height,
		     Image.SCALE_DEFAULT);
		   BufferedImage tag = new BufferedImage(width, height,
		     BufferedImage.TYPE_INT_RGB);
		   Graphics g = tag.getGraphics();
		   g.drawImage(image, 0, 0, null); // 绘制缩小后的图
		   g.dispose();
		   
		   
		   //获取文件名
		   String fileName="";
		   String endName="";
		   String end="";
		   String oldFilePath="";
		   if(srcImageFile!=null)
		   {
			   String d=File.separator;
			   
				 String splitStr="\\\\";
				  if(d.equals("\\"))//windows
				  {
					  splitStr="\\\\";
				  }
				  else//liunx
				  {
					  splitStr="/";
				  }
			   
		 	  String[] files=srcImageFile.split(splitStr);
		 	   fileName=files[files.length-1];
		 	  if(fileName!=null)
		 	  {
//		 		  String[] fileNames=fileName.split(".");
		 		  int it=fileName.lastIndexOf(".");
		 		  endName=fileName.substring(0,it);
		 		  //end=fileName.substring(1,4);
		 		  end=fileName.substring(it+1,fileName.length());
		 		  
		 	  }
		 	  
		 	  StringBuffer buffer=new StringBuffer();
		 	  for(int t=0;t<files.length-1;t++)
		 	  {
		 		 if(d.equals("\\"))//windows
				  {
		 			 buffer.append(files[t]).append("\\");
				  }
		 		 else
		 		 {
		 			 buffer.append(files[t]).append("/");
		 		 }
		 		  
		 		 
		 	  }
		 	  oldFilePath=buffer.toString();
		 	  
		 	  
		   }
		   
		   String myFilePath=oldFilePath;
		   if(result==null||result.equals(""))
		   {
			   if(mark!=null)
			   {
				   if(!mark.equals(""))
				   {
					   result=myFilePath+mark+"_"+endName+"."+end;
				   }
			   }   
		   }
		  
		  
		   
		   ImageIO.write(tag, "JPEG", new File(result));// 输出到文件流
		  } catch (IOException e) {
		   e.printStackTrace();
		  }
		 }
     
	 
	 
	 /**
	  * 等比例缩放图片
	  * 限制最大高度和最大宽度, 按等比例缩小.
	  */
	 public  void imgresize(String imgin, int maxwidth,int maxheight,String mark)
	 {
			boolean goon=false;
			
			int curWidth=0;
			int curHeight=0;
			if(maxwidth==0||maxheight==0) goon=false;
		        BufferedImage bis=null;
		        BufferedImage bid=null;
		        File file =new File(imgin);
		        try{
		            bis = ImageIO.read(file);
		            int c_w= bis.getWidth();
		            int c_h= bis.getHeight();
		            
		            curWidth = c_w;
		            curHeight = c_h;
		            
		            if(c_w>maxwidth  && c_h>maxheight)
		            {
		            	goon = true;
		            	
		            	//如果实际长度
		            	
		            	//很宽
		            	if( (c_w/c_h) > (maxwidth/maxheight) )
		            	{
		            		curWidth= maxwidth;
		            		curHeight = maxheight*maxwidth/c_w;
		            			
		            	}
		            	//很高
		            	else
		            	{
		            		curHeight = maxheight;
		            		curWidth = maxheight*c_w/c_h;
		            	}
		            }
		            
		            //获取文件名
		 		   String fileName="";
		 		   String endName="";
		 		   String end="";
		 		   String oldFilePath="";
		 		  String result="";
		 		   if(imgin!=null)
		 		   {
		 			   String d=File.separator;
		 			   
		 				 String splitStr="\\\\";
		 				  if(d.equals("\\"))//windows
		 				  {
		 					  splitStr="\\\\";
		 				  }
		 				  else//liunx
		 				  {
		 					  splitStr="/";
		 				  }
		 			   
		 		 	  String[] files=imgin.split(splitStr);
		 		 	   fileName=files[files.length-1];
		 		 	  if(fileName!=null)
		 		 	  {
//		 		 		  String[] fileNames=fileName.split(".");
		 		 		  int it=fileName.lastIndexOf(".");
		 		 		  endName=fileName.substring(0,it);
		 		 		  //end=fileName.substring(1,4);
		 		 		  end=fileName.substring(it+1,fileName.length());
		 		 		  
		 		 	  }
		 		 	  
		 		 	  StringBuffer buffer=new StringBuffer();
		 		 	  for(int t=0;t<files.length-1;t++)
		 		 	  {
		 		 		 if(d.equals("\\"))//windows
		 				  {
		 		 			 buffer.append(files[t]).append("\\");
		 				  }
		 		 		 else
		 		 		 {
		 		 			 buffer.append(files[t]).append("/");
		 		 		 }
		 		 		  
		 		 		 
		 		 	  }
		 		 	  oldFilePath=buffer.toString();
		 		 	  
		 		 	  
		 		   }
		 		   
		 		   String myFilePath=oldFilePath;
		 			if(mark!=null && !mark.equals(""))
		 			{
		 				result=myFilePath+mark+"_"+endName+"."+end;
		 			}
		 			else
		 			{
		 				 result=myFilePath+endName+"."+end;
		 			}
		 			
		 		//新的文件
		 		   File newFile = new File(result);
		 		   
		       if(goon) 
		       {     
		    	   //控制画布的大小,
		            bid= new BufferedImage(curWidth, curHeight,BufferedImage.TYPE_INT_RGB);                        
		            Graphics g = bid.getGraphics();
		            g.setColor(Color.white);
		            g.fillRect(0,0, curWidth, curHeight);           
		            g.drawImage(bis,0,0,curWidth, curHeight,null);  
		            ImageIO.write(bid, "JPEG", newFile);
		       }
		       else 
		       {
		       			ImageIO.write(ImageIO.read(newFile), "JPEG", newFile);
		       		
		       } 
		       } catch (Exception e)
		       {
		                      
		        }
		        bis=null;        
		        bid=null;
		}
     
     
     /****
      * 
      * 获取文件上传的文件名(25位的随机数字)
      * @return
      */
     
     public String loadUploadFileName()
     {
         StringBuffer fileName=new StringBuffer("");
         
         SimpleDateFormat format=new SimpleDateFormat("yyyyMMddHHmmss");
         
         //16位
         fileName.append(format.format(new Date()));
         
         //还需要9位随机数字
         fileName.append(random(9));
         
         return fileName.toString();
         
     }

     /**
      * 获取随机数字
      * @param size
      * @return
      */
     public String random(int size)
     {
         StringBuffer ret=new StringBuffer("");
         Random r=new Random();
         
         for(int j=0;j<size;j++)
         {
             int t=r.nextInt(10);
             
             ret.append(t);
             
         }
         
         return ret.toString();
     }



	public String getEndFileName() {
		return endFileName;
	}





	public void setEndFileName(String endFileName) {
		this.endFileName = endFileName;
	}





	public int getMaxFileSize() {
		return maxFileSize;
	}





	public void setMaxFileSize(int maxFileSize) {
		this.maxFileSize = maxFileSize;
	}




	public String getPath() {
		return path;
	}





	public void setPath(String path) {
		this.path = path;
	}





	public boolean isCheckFileTrueType() {
		return checkFileTrueType;
	}





	public void setCheckFileTrueType(boolean checkFileTrueType) {
		this.checkFileTrueType = checkFileTrueType;
	}





	public FormFile getMyFiles() {
		return myFiles;
	}





	public void setMyFiles(FormFile myFiles) {
		this.myFiles = myFiles;
	}





	public String[] getPassFileExtenSionName() {
		return passFileExtenSionName;
	}





	public void setPassFileExtenSionName(String[] passFileExtenSionName) {
		this.passFileExtenSionName = passFileExtenSionName;
	}
	 
	
	 
}
